/*************************************************************************
	> File Name: modbus.h
	> Author: xuwenlong
	> Mail: myxuan475@126.com 
	> Created Time: 2018年12月06日 星期四 10时28分43秒
 ************************************************************************/
#ifndef __MODBUS_H__
#define __MODBUS_H__
#include <defines.h>
#include <string>
#include <utils/lock.h>

class Modbus
{
public:
    Modbus();
    virtual ~Modbus();

    struct ModbusData
    {
        ModbusData() {
            id = 0;
            code = 0;
            addr = 0;
            len = 0;
            reg[0] = 0;
            reg[1] = 0;
        }

        U16 id;
        U8 code;
        U16 addr;
        U8 reg[2];
        U16 len;
    };

    void AcqDevice();

    virtual void OnReceiveData(void *data,S32 bytes);
    virtual BOOL SendData(const char *data,S32 bytes) = 0;

    void sendError(U16 id, U16 addr, U8 code, U16 err);
    void sendResult(U16 id,U16 addr,U8 code,U8 *data, U16 olen);

private:
    U16 getFormatData(ModbusData &get);
    U16  calcCRC16(U8 usData[],U16 len);
private:
    Lock        m_busLock;
    U8          m_busBuffer[MAX_CMD_LEN];
    U16         m_iLen;
};

#endif
